﻿
#region 文件信息
/*----------------------------------------------------------------
// 
// 文件名称：	
// 文件功能描述：	
// 设计要求：	
//
// 文 件 名：    Pool
// 创建者：      杨程
// 创建日期：	    2022/11/15 9:37:38

//----------------------------------------------------------------*/
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;



namespace Vampirewal.Coree.ClassObjectPool;

/// <summary>
/// 池
/// </summary>
public class Pool<T> where T : class,new()
{
    

    protected Stack<T> pool = new Stack<T>();
    //最大对象个数  <=0表示不限制个数
    protected int maxCount;
    //没有别回收的个数
    protected int noRecycleCount;
    public Pool(int maxCount)
    {
        this.maxCount = maxCount;
        for (int i = 0; i < maxCount; i++)
        {
            pool.Push(new T());
        }
    }

    /// <summary>
    /// 从池里面取类对象
    /// </summary>
    /// <param name="createIfPoolEmpty">如果为空是否new出来</param>
    public T Spawn(bool createIfPoolEmpty)
    {
        if (maxCount > 0)
        {
            T rtn = pool.Pop();
            if (rtn == null)
            {
                if (createIfPoolEmpty)
                {
                    rtn = new T();
                }
            }
            noRecycleCount++;
            return rtn;
        }
        else
        {
            if (createIfPoolEmpty)
            {
                T rtn = new T();
                noRecycleCount++;
                return rtn;
            }
        }
        return null;
    }

    /// <summary>
    /// 回收类对象
    /// </summary>
    public bool Recycle(T obj)
    {
        if (obj == null)
            return false;
        noRecycleCount--;
        if (pool.Count >= maxCount && maxCount > 0)
        {
            obj = null;
            return false;
        }
        pool.Push(obj);
        return true;
    }
}
